Unique Index {mongodb} {prisma}

aliases
No value
tags
mongodb/syntax prisma/mongodb
description
No value
status
ai response
project
false
area
true
resource
false
title
Unique Index {mongodb} {prisma}
created
2025-04-03T09:47:45
updated
2025-04-22T15:28:19

MongoDB์—์„œ ๊ณ ์œ ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ๊ธฐ ์œ„ํ•ด์„  ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๊ทธ๋ฆฌ๊ณ  PrismaORM์„ ์‚ฌ์šฉํ•  ๋•Œ @unique ์†์„ฑ๋งŒ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋ฐ”๋กœ ์ ์šฉ์ด ๋˜์ง€ ์•Š๋Š”๋ฐ prisma push๋ฅผ ํ•ด์•ผํ•˜๋Š”๊ฑธ๊นŒ?

AI Response (ChatGPT 4o)

์ข‹์€ ์งˆ๋ฌธ์ด์—์š”. MongoDB์™€ PrismaORM ๋ชจ๋‘์—์„œ ๊ณ ์œ  ์ œ์•ฝ ์กฐ๊ฑด (unique constraint) ์„ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š”.


โœ… MongoDB์—์„œ ๊ณ ์œ  ์ œ์•ฝ ์กฐ๊ฑด ๊ฑธ๊ธฐ

MongoDB๋Š” ์Šคํ‚ค๋งˆ๋ฆฌ์Šค(NoSQL) ์ด์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์œ ์ผ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1. MongoDB ์‰˜์ด๋‚˜ ๋“œ๋ผ์ด๋ฒ„์—์„œ ์ธ๋ฑ์Šค ์ƒ์„ฑ

db.users.createIndex({ email: 1 }, { unique: true })

๋ฐฉ๋ฒ• 2. Mongoose ์‚ฌ์šฉ ์‹œ

const userSchema = new Schema({
  email: { type: String, unique: true }
})

๋‹จ, Mongoose์˜ unique: true๋Š” MongoDB ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ผ๋Š” ํžŒํŠธ์ผ ๋ฟ์ด๊ณ , ์ž๋™์œผ๋กœ ๋ณด์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


โœ… Prisma ORM์—์„œ @unique ์„ค์ •์˜ ๋™์ž‘ ๋ฐฉ์‹

Prisma ORM์—์„œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ชจ๋ธ์— @unique ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋ถ™์—ฌ ์œ ๋‹ˆํฌ ์ œ์•ฝ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

model User {
  id    String @id @default(auto()) @map("_id") @db.ObjectId
  email String @unique
}

ํ•˜์ง€๋งŒ! Prisma์—์„œ๋Š” ์ด๊ฑธ ์ •์˜ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ DB์— ๋ฐ˜์˜๋˜๋Š” ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค.


๐Ÿ’ก Prisma์—์„œ @unique ์‚ฌ์šฉ ํ›„ ํ•ด์•ผ ํ•  ์ž‘์—…

์ž‘์—… ์„ค๋ช…
npx prisma db push ํ˜„์žฌ Prisma schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ MongoDB์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•  ๋•Œ ์‚ฌ์šฉ.
npx prisma migrate dev PostgreSQL, MySQL ๋“ฑ ๊ด€๊ณ„ํ˜• DB์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰. MongoDB์—์„œ๋Š” ๋น„์ถ”์ฒœ.

MongoDB์—์„œ๋Š” ๋ณดํ†ต prisma db push๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ”๏ธ ์š”์•ฝ: @unique ์†์„ฑ์„ ์„ ์–ธํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ npx prisma db push๋ฅผ ์‹คํ–‰ํ•ด์•ผ MongoDB์— unique ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ” ์ฃผ์˜์‚ฌํ•ญ

  1. ์ด๋ฏธ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด db push ์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
    • MongoDB๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์—๋„ ์œ ์ผ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธ๋ฑ์Šค ์ƒ์„ฑ์ด ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.
  2. Prisma์—์„œ๋Š” ํ˜„์žฌ MongoDB์— ๋Œ€ํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ, db push ๋ฐฉ์‹๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. Prisma MongoDB๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ _id ์™ธ ํ•„๋“œ์—๋„ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ธ๋ฑ์Šค ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— MongoDB Compass๋‚˜ CLI๋กœ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์ด ์ข‹์Šต๋‹ˆ๋‹ค.

2025-04-22 Troubleshooting) @unique attribute๋Š” null ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

In MongoDB (and by extension, Prisma with MongoDB), a unique index that allows multiple null values behaves differently than in traditional SQL databases:

If you want a field to be conditionally unique only when itโ€™s not null, you need to manually create a partial index in MongoDB outside of Prisma, since Prisma doesnโ€™t currently support partial indexes natively.

๐Ÿ”ง Step-by-step workaround:

  1. Remove @unique from Prisma schema:
model MyModel {
  id        String  @id @default(auto()) @map("_id") @db.ObjectId
  email     String? // โ† we want this to be unique only if NOT null
}
  1. Generate Prisma Client:
npx prisma generate
  1. Create the partial index manually in MongoDB shell:
db.mymodels.createIndex(
  { email: 1 },
  {
    unique: true,
    partialFilterExpression: { email: { $exists: true, $ne: null } }
  }
)

This ensures:


๐Ÿงช ์˜ˆ์ œ

model Product {
  id     String @id @default(auto()) @map("_id") @db.ObjectId
  sku    String @unique
  name   String
}
npx prisma db push

MongoDB์— ์ ‘์†ํ•ด์„œ ์ธ๋ฑ์Šค ํ™•์ธ:

db.product.getIndexes()

๊ฒฐ๊ณผ:

[
  { "key": { "_id": 1 }, "name": "_id_", "unique": true },
  { "key": { "sku": 1 }, "name": "Product_sku_key", "unique": true }
]

โœจ ์ถ”๊ฐ€ ํŒ

@@unique([firstName, lastName])

ํ•„์š”ํ•˜๋‹ค๋ฉด, Prisma + MongoDB ๊ตฌ์กฐ์—์„œ์˜ ์‹ค์ „ ์œ ์Šค์ผ€์ด์Šค (e.g. ํšŒ์› ๊ฐ€์ž… ์‹œ ์ค‘๋ณต ์ด๋ฉ”์ผ ์ฒ˜๋ฆฌ, ์œ ๋‹ˆํฌ ์‹คํŒจ ์‹œ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง) ๋„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”. ์›ํ•˜์‹œ๋‚˜์š”?